\appendix
\chapter{Wegwijs in de code}
\label{Wegwijs}

Onze codebase bestaat uit een aangepaste versie van Narcissus. 

Narcissus is onderverdeeld in volgende bestanden:

\begin{itemize}
\setlength{\parskip}{0.0in}
  \setlength{\itemindent}{1.0em}
 \item lib/jsbrowser.js
 \item lib/jsdecomp.js
 \item lib/jsdefs.js
 \item lib/jslex.js
 \item lib/jsparse.js
 \item lib/jsresolve.js
 \item lib/jsexec.js
\end{itemize}

Alle aanpassingen dat we hebben doorgevoerd aan Narcissus bevinden zich in het bestand lib/jsexec.js.

\section{API}
De volgende methodes zijn aangepast of toegevoegd aan dit bestand, en kunnen gebruikt worden om het prototype te testen.

\subsubsection{Narcissus.interpreter.evaluate(string code, [JSON policy])}

Voor deze methode zijn voor ons enkel de 2 eerste parameters van belang. Eerst en vooral de string code, die ge\"evalueerd zal worden en uitgevoerd wordt. De 2de parameter is de policy die moet afgedwongen worden op de meegegeven code. Deze is optioneel om het eenvoudig te houden, en niet bij elke call de volledige policy opnieuw te moeten parsen.
\begin{lstlisting}[caption=Voorbeeld evaluate methode ]
	Narcissus.interpreter.evaluate("alert(document.cookie);",{'cookie-read' : 'yes'});
\end{lstlisting}

\subsubsection{Narcissus.interpreter.evaluateUrl(string url, [JSON policy])}

Deze methode is sterk verwant met evaluate, evaluate wordt hier ook later in opgeroepen. Nadat de code gedownload is van op de gegeven url, wordt deze opgeroepen zoals in evaluate beschreven, met als string de gedownloade code. Ook hier hoeft niet noodzakelijk een policy meegegeven worden, als er een policy bestaat wordt deze behouden. Als er nog geen policy bestaat dan wordt een policy gegenereert die enkel de minimum aan functionaliteit toelaat.
\begin{lstlisting}[caption=voorbeeld evaluateUrl methode ]
	Narcissus.interpreter.evaluateUrl("my_script.js", {'cookie-read' : 'yes'});
\end{lstlisting}

\subsubsection{Narcissus.interpreter.evaluateHTML(string HTML, [Node appendTo])}
Zoals de naam doet vermoeden kan men door het geven van HTML als een string, die dan intern wordt geparset, nieuwe HTML nodes aan de DOM toegevoegen. Het element waaraan de gegenereerde nodes moeten toegevoegd worden kan optioneel ook meegegeven worden. Indien dit niet meegegeven is, wordt het achteraan bij document.body toegevoegd. In tegenstelling tot de vorige 2 methodes kan hier geen policy meegegeven worden. Maar de methode kan ook niet uitgevoerd worden wanneer er nog geen policy gegenereerd is. Dus er moet eerst een van de vorige methodes opgeroepen worden om deze methode te kunnen gebruiken. Dit heeft geen speciale reden, beter zou zijn om gewoon een setPolicy functie te implementeren die moet opgeroepen alvorens een van de voorgaande methodes opgeroepen kan worden.
\begin{lstlisting}[caption=voorbeeld evaluateHTML methode ]
	Narcissus.interpreter.evaluate("",{'cookie-read' : 'yes'}); // tijdelijke variant voor een setPolicy methode
	Narcissus.interpreter.evaluateHTML("<p>Dit is een paragraaf</p><a href='narciss.us'>dit is een link</a>");
\end{lstlisting}


Enkele andere belangrijke functies die het bekijken waard zijn om een beter inzicht te krijgen:
\begin{itemize}
\setlength{\parskip}{0.0in}
  \setlength{\itemindent}{1.0em}
 \item Narcissus.interpreter.parsePolicy()
 \item Narcissus.interpreter.getValue()
 \item Narcissus.interpreter.putValue()
 \item Narcissus.interpreter.executeSafely()
 \item ...
\end{itemize}


\section{Testsuite}
Ook de bestanden die gebruikt zijn voor de testsuite te runnen zijn meegegeven, met als hoofdbedoeling de mogelijkheid te geven onduidelijkheden in de aanpak te bekijken. 

\subsection{Overzicht}
Het belangrijkste bestand is chainfix.php, dit bestand voert uit wat reeds beschreven is in sectie \ref{AanpassenTestSuite}. Een mix van PHP, HTML en JavaScript zorgen ervoor dat deze tests uitgevoerd kunnen worden.

De bestanden libs.js, sta.js en unitTest.js worden hier ingeladen in Narcissus. Deze bevatten enerzijds functionaliteit om in SpiderMonkey te kunnen melden dat er een fout is opgetreden tijdens het uitvoeren van een test en anderzijds ook enkele extra hulpfuncties die in de tests gebruikt worden.

In datalayer/Test\_model.php staan alle queries die gebruikt worden. Zowel insert/update als de select queries.

Om niet in de database te moeten gaan kijken wat de uiteindelijke resultaten zijn is er ook nog view\_errors.php waar alle fouten bekomen in Narcissus getoond worden, en individueel nog eens hertest kunnen worden (voor eventueel te kunnen debuggen met tools als Firebug).

De overige bestanden zijn minder belangrijk in deze context, en dienen onder andere om het geheel werkbaarder te maken.

\subsection{Zelf testen}
Als men deze tests toch zelf wilt proberen runnen dan is dit ook mogelijk mits enkele kleine configuraties. 
\begin{itemize}
\setlength{\parskip}{0.0in}
  \setlength{\itemindent}{1.0em}
 \item Er is een sql file meegegeven om de tabellen te genereren. Deze records bevatten ook al reeds de door ons verkregen testresultaten (sql/db.sql).
 \item In het bestand settings/dataconfig.php moet de naam van de database met username/password ingesteld worden. 
 \item Het path naar het bestand staat relatief in de database, in de .php files zelf staat aangegeven waar dit kan aangepast worden om eventueel naar de juiste subdirectory te verwijzen waar de testbestanden zich bevinden.
\end{itemize}
Deze tests zijn uitgevoerd op een server met PHP versie 5.2.17 in combinatie met een MySQL database.
